From b8a5529c455b0d4c8d6cbcc12a1a14daa8613f65 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 6 Jan 2010 12:45:23 +0000 Subject: [PATCH] Handle PoD case in hvm_hap_nested_page_fault() The new combined nested page fault handling doesn't consider the case where the gfn_to_mfn() translation caused the page to be transparently populated. Signed-off-by: George Dunlap Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/hvm.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 3109a6df03..3bfe57cec4 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -951,15 +951,6 @@ bool_t hvm_hap_nested_page_fault(unsigned long gfn) if ( p2m_is_paged(p2mt) || (p2mt == p2m_ram_paging_out) ) p2m_mem_paging_populate(current->domain, gfn); - /* Log-dirty: mark the page dirty and let the guest write it again */ - if ( paging_mode_log_dirty(current->domain) - && p2m_is_ram(p2mt) && (p2mt != p2m_ram_ro) ) - { - paging_mark_dirty(current->domain, mfn_x(mfn)); - p2m_change_type(current->domain, gfn, p2m_ram_logdirty, p2m_ram_rw); - return 1; - } - /* Mem sharing: unshare the page and try again */ if ( p2mt == p2m_ram_shared ) { @@ -967,6 +958,14 @@ bool_t hvm_hap_nested_page_fault(unsigned long gfn) return 1; } + /* Spurious fault? PoD and log-dirty also take this path. */ + if ( p2m_is_ram(p2mt) ) + { + paging_mark_dirty(current->domain, mfn_x(mfn)); + p2m_change_type(current->domain, gfn, p2m_ram_logdirty, p2m_ram_rw); + return 1; + } + /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */ if ( p2mt == p2m_grant_map_ro ) { -- 2.30.2